import express from 'express';
import multer from 'multer';
import { exec } from 'child_process';
import path from 'path';
import fs from 'fs/promises';
import { fileURLToPath } from 'url';
import cors from 'cors';

// 配置路径
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 创建Express应用
const app = express();
const PORT = 3001;

// 创建临时目录用于存储上传和处理的文件
const TEMP_DIR = path.join(__dirname, 'temp');
const OUTPUT_DIR = path.join(__dirname, 'output');

// 确保目录存在
async function ensureDirectories() {
  try {
    await fs.mkdir(TEMP_DIR, { recursive: true });
    await fs.mkdir(OUTPUT_DIR, { recursive: true });
    console.log('临时目录和输出目录创建成功');
  } catch (error) {
    console.error('创建目录失败:', error);
  }
}

// 配置中间件 - 启用CORS以允许跨域请求
app.use(cors({
  origin: '*', // 允许所有来源访问
  methods: ['GET', 'POST', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'multipart/form-data']
}));

app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));

// 提供静态文件服务，使output目录中的文件可以通过HTTP访问
app.use('/output', express.static(OUTPUT_DIR));

// 配置文件存储
const storage = multer.diskStorage({
  destination: async (req, file, cb) => {
    try {
      await fs.mkdir(TEMP_DIR, { recursive: true });
      cb(null, TEMP_DIR);
    } catch (error) {
      cb(error);
    }
  },
  filename: (req, file, cb) => {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname));
  }
});

const upload = multer({
  storage,
  limits: {
    fileSize: 50 * 1024 * 1024 // 50MB
  },
  fileFilter: (req, file, cb) => {
    if (file.fieldname === 'image' && !file.mimetype.startsWith('image/')) {
      return cb(new Error('请上传有效的图片文件'));
    }
    if (file.fieldname === 'audio' && file.mimetype !== 'audio/mpeg') {
      return cb(new Error('请上传有效的MP3音频文件'));
    }
    cb(null, true);
  }
});

// API路由：转换视频
app.post('/api/convert', upload.fields([{ name: 'image' }, { name: 'audio' }]), async (req, res) => {
  try {
    console.log('收到转换请求');
    
    // 获取上传的文件
    const imageFile = req.files.image[0];
    const audioFile = req.files.audio[0];
    
    console.log('图片文件:', imageFile.originalname);
    console.log('音频文件:', audioFile.originalname);
    
    // 生成唯一的输出文件名
    const outputFilename = `output-${Date.now()}.mp4`;
    const outputPath = path.join(OUTPUT_DIR, outputFilename);
    
    // 构建FFmpeg命令
    const ffmpegCommand = `ffmpeg -loop 1 -i "${imageFile.path}" -i "${audioFile.path}" -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest -y -r 1 "${outputPath}"`;
    
    console.log('执行FFmpeg命令:', ffmpegCommand);
    
    // 执行FFmpeg命令
    await new Promise((resolve, reject) => {
      exec(ffmpegCommand, (error, stdout, stderr) => {
        if (error) {
          console.error('FFmpeg执行失败:', error);
          console.error('stderr:', stderr);
          reject(new Error('视频转换失败'));
          return;
        }
        console.log('FFmpeg输出:', stdout);
        resolve();
      });
    });
    
    // 清理临时文件
    try {
      await fs.unlink(imageFile.path);
      await fs.unlink(audioFile.path);
      console.log('临时文件清理成功');
    } catch (cleanupError) {
      console.error('临时文件清理失败:', cleanupError);
      // 不影响主要功能，继续执行
    }
    
    // 构建下载URL
    const downloadUrl = `/output/${outputFilename}`;
    
    console.log('转换成功，下载URL:', downloadUrl);
    
    res.json({
      success: true,
      downloadUrl,
      filename: outputFilename
    });
  } catch (error) {
    console.error('转换过程中的错误:', error);
    
    // 尝试清理临时文件
    try {
      if (req.files.image && req.files.image[0]) {
        await fs.unlink(req.files.image[0].path);
      }
      if (req.files.audio && req.files.audio[0]) {
        await fs.unlink(req.files.audio[0].path);
      }
    } catch (cleanupError) {
      console.error('错误清理临时文件时的错误:', cleanupError);
    }
    
    res.status(500).json({
      success: false,
      error: error.message || '视频转换失败'
    });
  }
});

// API路由：下载视频
app.get('/api/download/:filename', (req, res) => {
  try {
    const filename = req.params.filename;
    const filePath = path.join(OUTPUT_DIR, filename);
    
    console.log('下载请求:', filename);
    
    res.download(filePath, filename, (err) => {
      if (err) {
        console.error('下载失败:', err);
        res.status(404).json({
          success: false,
          error: '文件不存在或下载失败'
        });
      }
    });
  } catch (error) {
    console.error('下载过程中的错误:', error);
    res.status(500).json({
      success: false,
      error: error.message || '下载失败'
    });
  }
});

// 启动服务器
async function startServer() {
  try {
    // 确保目录存在
    await ensureDirectories();
    
    // 启动服务器
    app.listen(PORT, () => {
      console.log(`视频转换服务已启动，端口: ${PORT}`);
      console.log(`API地址: http://localhost:${PORT}/api/convert`);
      console.log(`静态文件服务: http://localhost:${PORT}/output`);
    });
  } catch (error) {
    console.error('启动服务器失败:', error);
  }
}

// 启动服务器
startServer();